#include <iostream>
using namespace std;

class Person {
  public:
    Person(const char* name) {
      int len = strlen(name);
      // 为 this->name 分配内存空间
      this->name = (char *)malloc(len+1);
      // 将参数拷贝到指定内存空间
      strcpy(this->name, name);
    }

    Person(Person &p) {
      int len = strlen(p.name);
      name = (char *)malloc(len + 1);
      memcpy(name, p.name, len+1);
    }

    ~Person() {
      cout << "析构函数" << endl;
      if(name != NULL) {
        free(name);
        name = NULL;
      }
    }
    Person& operator=(Person &p) {
      // // 释放自己的内存
      // if (name != NULL) {
      //   free(name);
      //   name = NULL;
      // }
      // // 再分配内存
      // int len = strlen(p.name);
      // name = (char *)malloc(len + 1);
      // memcpy(name, p.name, len+1);

      // 使用 realloc 的方式
      int len2 = strlen(p.name);
      name = (char *)realloc(name, len2+1);
      memcpy(name, p.name, len2+1);
      return *this;
    }

    void print() {
      cout << name << endl;
    }
  private:
    char *name;
};

void test() {
  Person p("Mango");
  p.print();
  // 使用默认拷贝构造，值拷贝
  Person p2 = p;
  p2.print();
}

void test2() {
  Person p1("Mango");
  p1.print();

  Person p2("Mango2");
  p2.print();
      
  // 赋值操作
  p2 = p1;
  p2.print();
} 
int main() {
  // test();
  test2();
  return 0;
}
